package leetcode.editor.cn;
//给定一个整数，写一个函数来判断它是否是 3 的幂次方。如果是，返回 true ；否则，返回 false 。 
//
// 整数 n 是 3 的幂次方需满足：存在整数 x 使得 n == 3ˣ 
//
// 
//
// 示例 1： 
//
// 
//输入：n = 27
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：n = 0
//输出：false
// 
//
// 示例 3： 
//
// 
//输入：n = 9
//输出：true
// 
//
// 示例 4： 
//
// 
//输入：n = 45
//输出：false
// 
//
// 
//
// 提示： 
//
// 
// -2³¹ <= n <= 2³¹ - 1 
// 
//
// 
//
// 进阶：你能不使用循环或者递归来完成本题吗？ 
//
// Related Topics 递归 数学 👍 319 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class Solution194 {


    /**
     * 在题目给定的 32 位有符号整数的范围内，最大的 3 的幂为 3^19 = 1162261467,我们只需要判断 n 是否是 3^19的约数即可
     *
     * @param n
     * @return
     */
    public boolean isPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }


    /**
     * Math.log returns the natural logarithm (base e) of a double value. Special case
     * 返回一个自然数：以e为底的对数
     *
     * @param n
     * @return
     */
    public boolean isPowerOfThree2(int n) {
        if (n < 1) return false;
        int x = (int) (Math.log(n) / Math.log(3));
        return (x = (int) Math.pow(3, x)) == n || x * 3 == n;

    }

    public boolean isPowerOfThree1(int n) {
        if (n <= 0) {
            return false;
        }
        while (n % 3 == 0) {
            n /= 3;
        }
        return n == 1;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
